package thread;

/**
 * 静态方法的同步
 * 当一个静态方法上使用synchronized修饰后，那么该方法一定具有同步效果
 */
public class SyncDemo3 {
    public static void main(String[] args) {
//        Thread t1 = new Thread(()->Foo.doSome());
//        Thread t2 = new Thread(()->Foo.doSome());

        Foo f1 = new Foo();
        Foo f2 = new Foo();
        Thread t1 = new Thread(()->f1.doSome());
        Thread t2 = new Thread(()->f2.doSome());
        t1.start();
        t2.start();
    }
}

class Foo{
    /*
        当一个静态方法上使用synchronized时，同步监视器对象为当前类的类对象
        即:Class的实例
        类对象知识会在后面学习反射时介绍
        JVM中每个被加载的类都有且只有唯一的一个Class实例与之对应
     */
//    public synchronized static void doSome(){
    public static void doSome(){
        //如果使用同步块，则直接使用当前类的类对象作为同步监视器对象即可
        synchronized (Foo.class) {//同步监视器对象的获取:类名.class
            Thread thread = Thread.currentThread();
            System.out.println(thread.getName() + "开始执行doSome方法...");
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println(thread.getName() + "执行doSome方法完毕...");
        }
    }
}
